home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / machack / Hacks97 / WarriorsProgress.sit / Warrior’s Progress / source code / Source / Libraries / Sequence / Sequence.cp next >
Text File  |  1997-06-28  |  2KB  |  85 lines

  1. // Sequence.cp
  2.  
  3. #ifndef Sequence_h
  4. #include "Sequence.h"
  5. #endif
  6. #ifndef SequenceLoop_h
  7. #include "SequenceLoop.h"
  8. #endif
  9.  
  10. template < class Head, class Node >
  11. Sequence<Head,Node>::Sequence()
  12.   : firstLoop( 0 )
  13.   {
  14.   }
  15.  
  16. template < class Head, class Node >
  17. Sequence<Head,Node>::~Sequence()
  18.   {
  19.     Assert( firstLoop == 0 );
  20.   }
  21.  
  22. template < class Head, class Node >
  23. void Sequence<Head,Node>::Register( Loop& loop ) const
  24.   {
  25.     Assert( &loop.head == this );
  26.     loop.nextLoop = firstLoop;
  27.     const_cast< Loop *& >( firstLoop ) = &loop;
  28.   }
  29.  
  30. template < class Head, class Node >
  31. void Sequence<Head,Node>::Unregister( Loop& loop ) const
  32.   {
  33.     Assert( &loop.head == this );
  34.     
  35.     Loop** connection = const_cast< Loop ** >( &firstLoop );
  36.     while ( *connection != &loop )
  37.       {
  38.         Assert( *connection != 0 );
  39.         connection = &(*connection)->nextLoop;
  40.       }
  41.     
  42.     *connection = loop.nextLoop;
  43.     loop.nextLoop = 0;
  44.   }
  45.  
  46. template < class Head, class Node >
  47. void Sequence<Head,Node>::WillRemove( Node& n )
  48.   {
  49.     for ( Loop *loop = firstLoop;
  50.             loop != 0;
  51.             loop = loop->nextLoop )
  52.       {
  53.         if ( loop->position == &n )
  54.           {
  55.             loop->position = 0;
  56.             loop->next = n.Next();
  57.             loop->previous = n.Previous();
  58.           }
  59.          else if ( loop->next == &n )
  60.             loop->next = n.Next();
  61.          else if ( loop->previous == &n )
  62.              loop->previous = n.Previous();
  63.       }
  64.   }
  65.  
  66. template < class Head, class Node >
  67. void Sequence<Head,Node>::WillAdd( Node& a, Before, const Node *b )
  68.   {
  69.     for ( Loop *loop = firstLoop;
  70.             loop != 0;
  71.             loop = loop->nextLoop )
  72.         if ( loop->next == b && loop->Unfinished() )
  73.             loop->next = &a;
  74.   }
  75.  
  76. template < class Head, class Node >
  77. void Sequence<Head,Node>::WillAdd( Node& a, After, const Node *b )
  78.   {
  79.     for ( Loop *loop = firstLoop;
  80.             loop != 0;
  81.             loop = loop->nextLoop )
  82.         if ( loop->previous == b && loop->Unfinished() )
  83.             loop->previous = &a;
  84.   }
  85.